gsk: Add fallback code to renderers
authorBenjamin Otte <otte@redhat.com>
Tue, 13 Dec 2016 03:20:04 +0000 (04:20 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:10 +0000 (18:01 +0100)
This code makes renderers fall back to Cairo rendering if they don't
know how to handle a render node's type.

This allows adding new render nodes with impunity.

gsk/gskglrenderer.c
gsk/gskvulkanrenderpass.c

index 5cbb0a0029f8384eeb1c74c707c831b8472eab7f..bb98e2ff420ec21d85e163aa1cb977093775a47f 100644 (file)
@@ -760,8 +760,40 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
       return;
 
     case GSK_NOT_A_RENDER_NODE:
-    default:
+      g_assert_not_reached ();
       return;
+
+    default:
+      {
+        graphene_rect_t bounds;
+        cairo_surface_t *surface;
+        cairo_t *cr;
+
+        gsk_render_node_get_bounds (node, &bounds);
+
+        surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+                                              ceil (bounds.size.width),
+                                              ceil (bounds.size.height));
+        cr = cairo_create (surface);
+        cairo_translate (cr, -bounds.origin.x, -bounds.origin.y);
+
+        gsk_render_node_draw (node, cr);
+        
+        cairo_destroy (cr);
+
+        /* Upload the Cairo surface to a GL texture */
+        item.render_data.texture_id = gsk_gl_driver_create_texture (self->gl_driver,
+                                                                    item.size.width,
+                                                                    item.size.height);
+        gsk_gl_driver_bind_source_texture (self->gl_driver, item.render_data.texture_id);
+        gsk_gl_driver_init_texture_with_surface (self->gl_driver,
+                                                 item.render_data.texture_id,
+                                                 surface,
+                                                 GL_NEAREST, GL_NEAREST);
+
+        cairo_surface_destroy (surface);
+      }
+      break;
     }
 
   /* Create the vertex buffers holding the geometry of the quad */
index 62af7e324cf40ae39d13bff7ee1de696a2745bcd..86ac1a198bc1eab69e3f4a78dfb5c2743aa2eb54 100644 (file)
@@ -72,10 +72,14 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass     *self,
   switch (gsk_render_node_get_node_type (node))
     {
     case GSK_NOT_A_RENDER_NODE:
-    default:
       g_assert_not_reached ();
       break;
 
+    default:
+      op.type = GSK_VULKAN_OP_FALLBACK;
+      g_array_append_val (self->render_ops, op);
+      break;
+
     case GSK_CAIRO_NODE:
       op.type = GSK_VULKAN_OP_SURFACE;
       g_array_append_val (self->render_ops, op);
@@ -150,7 +154,7 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self,
                                         ceil (bounds.size.width),
                                         ceil (bounds.size.height));
   cr = cairo_create (surface);
-  cairo_translate (cr, bounds.origin.x, bounds.origin.y);
+  cairo_translate (cr, -bounds.origin.x, -bounds.origin.y);
 
   gsk_render_node_draw (op->node, cr);